#ifndef NETWORKTHREAD_H
#define NETWORKTHREAD_H

#include <QThread>
#include <QObject>
#include <QJsonObject>
#include <QMutex>
#include <QWaitCondition>
#include "websocketclient.h"


// WebSocket配置结构（复制自SnakeGameManager，避免依赖）
struct NetworkWebSocketConfig {
    QString url;                    ///< WebSocket服务器URL
    QString gameToken;              ///< WebSocket连接认证令牌（access_token）
    QString sessionToken;           ///< WebSocket消息认证令牌（session_token）
    QString playerId;               ///< 玩家ID
    QString playerName;             ///< 玩家名称
    QString clientType = "qt6";     ///< 客户端类型
    QString protocolVersion = "1.0"; ///< 协议版本
    int heartbeatInterval = 30000;  ///< 心跳间隔（毫秒）
    bool autoReconnect = true;      ///< 自动重连
    int maxReconnectAttempts = 5;   ///< 最大重连次数
};

/**
 * @brief 专用网络线程类
 *
 * 负责在独立线程中处理：
 * 1. WebSocket连接和认证
 * 2. 游戏消息的发送和接收
 * 3. 网络状态管理
 * 4. 与主线程的消息传递
 */
class NetworkThread : public QThread
{
    Q_OBJECT

public:
    explicit NetworkThread(QObject *parent = nullptr);
    ~NetworkThread();

    /**
     * @brief 启动网络线程并连接到游戏服务器
     * @param config WebSocket配置
     */
    void connectToGameServer(const NetworkWebSocketConfig &config);

    /**
     * @brief 发送消息到服务器
     * @param message JSON消息
     */
    void sendMessage(const QJsonObject &message);

    /**
     * @brief 断开连接并停止线程
     */
    void disconnectAndStop();

    /**
     * @brief 获取连接状态
     */
    bool isConnected() const;

signals:
    /**
     * @brief 连接成功信号
     */
    void connected();

    /**
     * @brief 连接断开信号
     */
    void disconnected(const QString &reason);

    /**
     * @brief 认证成功信号
     */
    void authenticated();

    /**
     * @brief 认证失败信号
     */
    void authenticationFailed(const QString &error);

    /**
     * @brief 接收到游戏消息信号
     * @param message 游戏消息
     */
    void gameMessageReceived(const QJsonObject &message);

    /**
     * @brief 连接错误信号
     */
    void connectionError(const QString &error);

    /**
     * @brief 网络统计信号
     */
    void networkStats(int ping, int messagesPerSecond);

    /**
     * @brief 游戏错误信号
     */
    void gameError(const QString &error);

protected:
    /**
     * @brief 线程运行函数
     */
    void run() override;

private slots:
    /**
     * @brief WebSocket连接成功处理
     */
    void onWebSocketConnected();

    /**
     * @brief WebSocket断开连接处理
     */
    void onWebSocketDisconnected();

    /**
     * @brief WebSocket认证成功处理
     */
    void onWebSocketAuthenticated(const QJsonObject &playerInfo);

    /**
     * @brief WebSocket认证失败处理
     */
    void onWebSocketAuthenticationFailed(const QString &error);

    /**
     * @brief WebSocket消息接收处理
     */
    void onWebSocketMessageReceived(const QJsonObject &message);

    /**
     * @brief WebSocket错误处理
     */
    void onWebSocketError(const QString &error);

    /**
     * @brief 处理待发送消息队列
     */
    void processPendingMessages();


public slots:
    /**
     * @brief 启动单人游戏模式
     */
    void startSinglePlayerGame();

    /**
     * @brief 渲染管线就绪槽
     */
    void onRenderPipelineReady();

private:
    /**
     * @brief 初始化网络组件
     */
    void initializeNetworkComponents();

    /**
     * @brief 清理网络组件
     */
    void cleanupNetworkComponents();

    /**
     * @brief 统一处理错误消息
     * @param message 错误消息JSON对象
     */
    void handleErrorMessage(const QJsonObject &message);

    // === 网络组件 ===
    WebSocketClient *m_webSocketClient;

    // === 线程控制 ===
    bool m_running;
    bool m_connected;
    mutable QMutex m_stateMutex;

    // === 消息队列 ===
    QList<QJsonObject> m_pendingMessages;
    mutable QMutex m_messageMutex;
    QWaitCondition m_messageCondition;

    // === 配置 ===
    NetworkWebSocketConfig m_config;
    bool m_configSet;

    // === 统计 ===
    int m_messagesSent;
    int m_messagesReceived;
    qint64 m_lastPingTime;

    // === 会话缓存 ===
    QString m_wsPlayerId;  // WebSocket临时player_id（来自authentication_result）

    QString m_lastRoomId;
    QString m_currentRoomId;  // 当前房间ID上下文

    // === 状态位（幂等控制）===
    bool m_startGameRequested = false;
    bool m_gameStarted = false;
    bool m_gameStartBlocked = false;     // 游戏启动永久阻止标志
    bool m_renderPipelineReady = false;  // 渲染管线就绪标志

    // === 消息缓存 ===
    QJsonObject m_pendingCreateRoomMessage;  // 缓存的create_room消息

};

#endif // NETWORKTHREAD_H
